<?php

/**
 * Strumenti di aiuto di creazione di una pagina che permette l'aggiunta di un
 * nuovo elemento del model.
 */
define("FORM_TEXT", 0);
define("FORM_TEXT_LONG", 1);
define("FORM_NUMERIC", 2);
define("FORM_LIST", 3);
define("FORM_PASSWORD", 4);
define("FORM_CHECKBOX", 5);
define("FORM_HIDDEN", 6);
define("FORM_DATE", 7);
define("FORM_EXTERNAL_SELECTOR", 8);
define("FORM_RICH_TEXT_AREA", 9);
define("FORM_UPLOAD_FILE", 10);

define("TEXT_FIELD_DEFAULT_SIZE",100);
define("TEXT_AREA_DEFAULT_ROWS_NUM",7);
define("TEXT_AREA_DEFAULT_COLS_NUM",122);
define("PASSWORD_TEXT_FIELD_DEFAULT_SIZE",75);
define("NUMERIC_FIELD_DEFAULT_SIZE",25);
define("RICH_TEXT_AREA_DEFAULT_WIDTH",700);
define("RICH_TEXT_AREA_DEFAULT_HEIGHT",300);

define("TINY_MCE_INSTALL_DIR", "Lib/tinymce/tinymce.min.js");

/**
 * Classe che espone le proprietà di un file in upload.
 */
class UploadedFile
{
	/**
	 * Nome del file.
	 * @var string Nome del file.
	 */
	public $fileName;
	/**
	 * Grandezza del file, in byte.
	 * @var int Grandezza del file, in byte.
	 */
	public $fileSize;
	/**
	 * Tipo del file espresso come MIME-Type.
	 * @var string Tipo del file espresso come MIME-Type.
	 */
	public $fileType;
	/**
	 * TUTTO il contenuto del file espresso come stringa di byte.
	 * @var string TUTTO il contenuto del file espresso come stringa di byte.
	 */
	public $fileContent;
}

/**
 * Classe utility per creare form facilemente a partire dalle proprietà di un
 * componente del model.
 */
class ModelUtils
{
	
	/**
	* Utility che fà l'escaping delle virgolette(double quotes)
	* @param string $str Stringa su cui fare l'escape
	* @return string Stringa 'escaped';
	*/
	public static function escape_dq($str)
	{
		return str_replace('"', '\\"', $str);
	}

	/**
	* Utility che fà l'escaping degli apostrofi(single quotes)
	* @param string $str Stringa su cui fare l'escape
	* @return string Stringa 'escaped';
	*/
	public static function escape_sq($str)
	{
		return str_replace("'", "\\'", $str);
	}

	/**
	* Utility che fà l'escaping degli apostrofi(single quotes) per l'SQL
	* @param string $str Stringa su cui fare l'escape
	* @return string Stringa 'escaped';
	*/
	public static function escape_sq_for_SQL($str)
	{
		return str_replace("'", "''", $str);
	}

	private static $onlyFirstTimeCodeInjected = false;
	private static $currentFormName = "";

	/**
	 * Restituisce l'opening di un form che contiene già uno script per il
	 * controllo dei campi obbligatori.
	 * @param string $action Campo ACTION del form HTML.
	 * @param string $method Campo METHOD del form HTML.
	 * @param string $formName Nome del form.
	 * @return string Stringa contenete l'html del form da stampare a video.
	 */
	public static function getFormOpening($action, $method = "POST", $formName = "main")
	{
		self::$currentFormName = $formName;
		$res =	'<script language="javascript" type="text/javascript">'.PHP_EOL.
				'var formName, mandatoryFields;'.PHP_EOL.
				'formName = "'.$formName.'";'.PHP_EOL.
				'if(mandatoryFields == undefined) mandatoryFields = new Array();'.PHP_EOL.
				'mandatoryFields[formName] = new Array();'.PHP_EOL;
		if(!self::$onlyFirstTimeCodeInjected)
			$res .=
				'function onFormSubmit(fname) {'.PHP_EOL.
				'for(var i = 0; i < mandatoryFields[fname].length; i++) {'.PHP_EOL.
				'if(mandatoryFields[fname][i].value == null || mandatoryFields[fname][i].value.length == 0) {alert("Alcuni campi obbligatori sono vuoti!"); return false; }'.PHP_EOL.
				'}'.PHP_EOL.
				'return true;'.PHP_EOL.
				'}'.PHP_EOL.
				'function selectExternalElement(selectorPath,formName,fieldName,modelToListName,optionalFieldToPopulate,conditionOnSelect_Param,conditionOnSelect_Value)'.PHP_EOL.
				'{'.PHP_EOL.
				'var optionalFld = "";'.PHP_EOL.
				'if(optionalFieldToPopulate !== null) {'.PHP_EOL.
				'for (var key in optionalFieldToPopulate) {'.PHP_EOL.
				'optionalFld += "&OptionalFields["+key+"]="+optionalFieldToPopulate[key];'.PHP_EOL.
				'}'.PHP_EOL.
				'}'.PHP_EOL.
				'var condition = "";'.PHP_EOL.
				'if(conditionOnSelect_Param != "" && conditionOnSelect_Value != "") {'.PHP_EOL.
				'condition = "&ConditionParam="+conditionOnSelect_Param+"&ConditionValue="+conditionOnSelect_Value;'.PHP_EOL.
				'}'.PHP_EOL.
				'window.open(selectorPath+"?FormName="+formName+"&FieldId="+fieldName+"&ModelName="+modelToListName+optionalFld+condition,"_blank","width=913, height=600, scrollbars=1 ");'.PHP_EOL.
				'}'.PHP_EOL;
		$res .=	'</script>'.PHP_EOL.
				'<form method="'.$method.'" action="'.$action.'" enctype="multipart/form-data" onSubmit="javascript: return onFormSubmit(\''.$formName.'\');" name="'.$formName.'" >'.PHP_EOL.
				'<br/><b>&#42; I campi contrassegnati non posso essere lasciati vuoti.</b><br/>'.PHP_EOL;
		self::$onlyFirstTimeCodeInjected = true;
		return $res;
	}

	/**
	 * Aggiunge un elemento di un form alla lista dei campi obbligatori.
	 * @param string $formElemName Nome del campo obbligatorio da aggiungere.
	 * @return string Stringa contenete l'html da stampare a video.
	 */
	private static function addFormElementToMandatoryElementsList($formElemName)
	{
		return  '<script language="javascript" type="text/javascript">'.
				'mandatoryFields[formName].push(document.getElementsByName(\''.self::$currentFormName.'\')[0].elements[\''.$formElemName.'\']);'.
				'</script>';
	}

	/**
	 * Restituisce la parte finale di un form che contiene già uno script per il
	 * controllo dei campi obbligatori.
	 * @return string Stringa contenete l'html del form da stampare a video.
	 */
	public static function getFormClosing()
	{
		return  '</form>';
	}

	/**
	 * Restituisce un elemento di un form HTML che rappresenta un normale campo
	 * di testo.
	 * @param string $name Nome del campo.
	 * @param string $defaultVal Valore iniziale.
	 * @param boolean $mandatory Se questo campo deve essere obbligatoriamente
	 * impostato.
	 * @param int $size Grandezza in numero di caratteri del campo di testo:
	 * usare il valore NULL per specificare la grandezza di default o 0 per non
	 * specificare proprio questo attributo.
	 * @param string $other Altre propietà del componente HTML.
	 * @return string Stringa contenete l'html del campo di testo da stampare a
	 * video.
	 */
	public static function getTextFormElement($name, $defaultVal = "", $mandatory = false, $size = NULL, $other = "")
	{
		if($size === NULL)
			$size = TEXT_FIELD_DEFAULT_SIZE;
		$sizestr = "";
		if($size != 0)
			$sizestr = 'size="'.$size.'"';
		$str = '<input type="text" list="'.$name.'_datalist" name="'.$name.'" value="'.self::escape_dq($defaultVal).'" '.$sizestr.' '.$other.' />';
		if($mandatory)
			return $str."<b>&#42;</b>\n".self::addFormElementToMandatoryElementsList($name);
		else
			return $str;
	}

	/**
	 * Crea una serie di valori predefiniti per un campo di testo.
	 * @param type $textFromElemName Nome del campo di testo a cui applicare la
	 * serie di valori predefiniti.
	 * @param type $datalist Array di tutti i valori predefiniti per il campo
	 * di testo.
	 * @return string Stringa contenete l'html del datalist da stampare a video.
	 */
	public static function getDatalistForTextFormElement($textFromElemName, $datalist)
	{
		$str = '<datalist id="'.$textFromElemName.'_datalist">';
		foreach($datalist as $d)
		{
			$str .= '<option value="'.$d.'">';
		}
		$str .= '</datalist>';
		return $str;
	}

	/**
	 * Restituisce un elemento di un form HTML che rappresenta un grande campo
	 * di testo(un area di testo).
	 * @param string $name Nome del campo.
	 * @param string $defaultVal Valore iniziale.
	 * @param int $cols Largezza del campo di testo espresso in numero di
	 * caratteri: assegnare NULL per usare il valore di default e assegnare 0
	 * per non specificare proprio questo attributo.
	 * @param int $rows Altezza del campo di testo espresso in numero di
	 * caratteri: assegnare NULL per usare il valore di default e assegnare 0
	 * per non specificare proprio questo attributo.
	 * @param boolean $mandatory Se questo campo deve essere obbligatoriamente
	 * impostato.
	 * @param string $other Altre propietà del componente HTML.
	 * @return string Stringa contenete l'html del campo di testo da stampare a
	 * video.
	 */
	public static function getLongTextFormElement($name, $defaultVal = "", $cols = NULL, $rows = NULL, $mandatory = false, $other = "")
	{
		if($cols === NULL)
			$cols = TEXT_AREA_DEFAULT_COLS_NUM;
		if($rows === NULL)
			$rows = TEXT_AREA_DEFAULT_ROWS_NUM;
		$sizecstr = "";
		if($cols != 0)
			$sizecstr = 'cols="'.$cols.'"';
		$sizerstr = "";
		if($rows != 0)
			$sizerstr = 'rows="'.$rows.'"';
		$str = '<textarea name="'.$name.'" '.$sizecstr.' '.$sizerstr.' '.$other.' >'.$defaultVal.'</textarea>';
		if($mandatory)
			return $str."<b>&#42;</b>\n".self::addFormElementToMandatoryElementsList($name);
		else
			return $str;
	}

	/**
	 * Restituisce un elemento di un form HTML che rappresenta un campo di
	 * testo che accetta numeri.
	 * @param string $name Nome del campo.
	 * @param int $defaultVal Valore iniziale o NULL per non specificarlo.
	 * @param int $min Minimo valore accettato o NULL per non specificarlo.
	 * @param int $max Massimo valore accettato o NULL per non specificarlo.
	 * @param boolean $mandatory Se questo campo deve essere obbligatoriamente
	 * impostato.
	 * @param int $size Grandezza in numero di caratteri del campo di testo:
	 * usare il valore NULL per specificare la grandezza di default o 0 per non
	 * specificare proprio questo attributo.
	 * @param string $other Altre propietà del componente HTML.
	 * @return string Stringa contenete l'html del campo di testo da stampare a
	 * video.
	 */
	public static function getNumericFormElement($name, $defaultVal = NULL, $min = NULL, $max = NULL, $mandatory = false, $size = NULL, $other = "")
	{
		$mintxt = ($min == NULL ? "" : 'min="'.$min.'"');
		$maxtxt = ($max == NULL ? "" : 'max="'.$max.'"');
		if($size === NULL)
			$size = NUMERIC_FIELD_DEFAULT_SIZE;
		$sizestr = "";
		if($size != 0)
			$sizestr = 'size="'.$size.'"';
		$defvaltxt = ($defaultVal == NULL ? "" : 'value="'.$defaultVal.'"');
		$str = '<input type="number" name="'.$name.'" '.$mintxt.' '.$maxtxt.' '.$defvaltxt.' '.$sizestr.' '.$other.' />';
		if($mandatory)
			return $str."<b>&#42;</b>\n".self::addFormElementToMandatoryElementsList($name);
		else
			return $str;
	}

	/**
	 * Restituisce un elemento di un form HTML che rappresenta un campo di
	 * scelta multipla a tendina.
	 * @param string $name Nome del campo.
	 * @param mixed $defaultVal Valore iniziale o NULL per non specificarlo.
	 * @param array $elements Lista di elementi presenti in questo elemento Form:
	 * i valori devono essere espressi come array in Chiave-Valore, dove la
	 * Chiave nell'array rappresenta il valore dell'elemento, e il Valore nell'
	 * array rappresenta la Label mostrata.
	 * @param boolean $mandatory Se questo campo deve essere obbligatoriamente
	 * impostato.
	 * @param string $other Altre propietà del componente HTML.
	 * @return string Stringa contenete l'html della lista da stampare a video.
	 */
	public static function getListFormElement($name, $defaultVal = NULL, $elements = array("exampleElemVal" => "Example Element Label"), $mandatory = false, $other = "")
	{
		$resStr = '<select name="'.$name.'" '.$other.' >';
		foreach($elements as $key => $value)
		{
			if($defaultVal == $key)
				$resStr .= '<option value="'.$key.'" selected >'.$value.'</option>';
			else
				$resStr .= '<option value="'.$key.'">'.$value.'</option>';
		}
		$resStr .= '</select>';
		if($mandatory)
			return $resStr."<b>&#42;</b>\n".self::addFormElementToMandatoryElementsList($name);
		else
			return $resStr;
	}

	/**
	 * Restituisce un elemento di un form HTML che rappresenta un campo di testo
	 * password.
	 * @param string $name Nome del campo.
	 * @param string $defaultVal Password iniziale.
	 * @param boolean $mandatory Se questo campo deve essere obbligatoriamente
	 * impostato.
	 * @param int $size Grandezza in numero di caratteri del campo di testo:
	 * usare il valore NULL per specificare la grandezza di default o 0 per non
	 * specificare proprio questo attributo.
	 * @param string $other Altre propietà del componente HTML.
	 * @return string Stringa contenete l'html del campo di testo password da
	 * stampare a video.
	 */
	public static function getPasswordFormElement($name, $defaultVal = "", $mandatory = false, $size = NULL, $other = "")
	{
		if($size === NULL)
			$size = NUMERIC_FIELD_DEFAULT_SIZE;
		$sizestr = "";
		if($size != 0)
			$sizestr = 'size="'.$size.'"';
		$str = '<input type="password" name="'.$name.'" value="'.self::escape_dq($defaultVal).'" '.$sizestr.' '.$other.' />';
		if($mandatory)
			return $str."<b>&#42;</b>\n".self::addFormElementToMandatoryElementsList($name);
		else
			return $str;
	}

	/**
	 * Restituisce un elemento di un form HTML che rappresenta una casella di
	 * spunta che può assumere solo 2 possibili valori: spuntata e non.
	 * @param string $name Nome del campo.
	 * @param string $valueToReturn Valore da assumere nel caso sia spuntata.
	 * @param boolean $defaultChecked Se inizialmente è spuntata o meno.
	 * @param boolean $mandatory Se questo campo deve essere obbligatoriamente
	 * impostato.
	 * @param string $other Altre propietà del componente HTML.
	 * @return string Stringa contenete l'html della casella di spunta da stampare
	 * a video.
	 */
	public static function getCheckBoxFormElement($name, $valueToReturn, $defaultChecked = false, $mandatory = false, $other = "")
	{
		$str = '<input type="checkbox" name="'.$name.'" value="'.self::escape_dq($valueToReturn).'" '.($defaultChecked == true ? 'checked' : '').' '.$other.' />';
		if($mandatory)
			return $str."<b>&#42;</b>\n".self::addFormElementToMandatoryElementsList($name);
		else
			return $str;
	}

	/**
	 * Restituisce un elemento di un form HTML che rappresenta un valore che
	 * sarà inviato nella richiesta del form ma che è invisibile all'utente.
	 * @param string $name Nome del campo.
	 * @param string $value Valore associato a questo campo: non può essere
	 * modificato dall'utente.
	 * @param boolean $mandatory Se questo campo deve essere obbligatoriamente
	 * impostato.
	 * @param string $other Altre propietà del componente HTML.
	 * @return string Stringa contenete l'html del campo invisibile da stampare a
	 * video.
	 */
	public static function getHiddenFormElement($name, $value, $mandatory = false, $other = "")
	{
		$str = '<input type="hidden" name="'.$name.'" value="'.$value.'" '.$other.' />'.htmlentities($value);
		if($mandatory)
			return $str."<b>&#42;</b>\n".self::addFormElementToMandatoryElementsList($name);
		else
			return $str;
	}

	/**
	 * Restituisce un elemento di un form HTML che rappresenta un campo di testo
	 * multiplo per l'inserimento di una data.
	 * @param string $name Nome del campo.
	 * @param int $defaultVal Data iniziale.
	 * @param boolean $mandatory Se questo campo deve essere obbligatoriamente
	 * impostato.
	 * @param string $other Altre propietà del componente HTML.
	 * @return string Stringa contenete l'html del campo di testo da stampare a
	 * video.
	 */
	public static function getDateFormElement($name, $defaultVal = NULL, $mandatory = false, $other = "")
	{
		/*
		$resStr = '<select name="'.$name.'" '.$other.' >';
		foreach($elements as $key => $value)
		{
			if($defaultVal == $key)
				$resStr .= '<option value="'.$key.'" selected >'.$value.'</option>';
			else
				$resStr .= '<option value="'.$key.'">'.$value.'</option>';
		}
		$resStr .= '</select>';
		 */
		$year = NULL;
		$month = NULL;
		$day = NULL;
		if($defaultVal != NULL && is_int($defaultVal))
		{
			$year = (int)date("Y",$defaultVal);
			$month = (int)date("m",$defaultVal);
			$day = (int)date("d",$defaultVal);
		}
		//giorni
		$str = '<select name="'.$name.'[day]" '.$other.' >'.PHP_EOL;
		$str .= '<option value="" '.($day === NULL ? "selected" : "").'> - </option>'.PHP_EOL;
		for($i = 1; $i < 32; $i++)
			$str .= '<option value="'.$i.'" '.($i === $day ? "selected" : "").'>'.$i.'</option>'.PHP_EOL;
		$str .= '</select>'.PHP_EOL;
		//mesi
		$str .= '<select name="'.$name.'[month]" '.$other.' >'.PHP_EOL;
		$str .= '<option value="" '.($month === NULL ? "selected" : "").'> - </option>'.PHP_EOL;
		for($i = 1; $i < 13; $i++)
			$str .= '<option value="'.$i.'" '.($i === $month ? "selected" : "").'>'.Utils::$monthNames[$i].'</option>'.PHP_EOL;
		$str .= '</select>'.PHP_EOL;
		//anni
		$str .= '<input type="number" name="'.$name.'[year]" '.($year != NULL ? 'value="'.$year.'"' : "").' size="4" style="width:50px;" '.$other.' />'.PHP_EOL;
		//tasto oggi
		$str .= '<input type="button" value="Oggi" onclick="javascript:document.getElementsByName(\''.$name.'[day]\')[0].value='.date("d").'; document.getElementsByName(\''.$name.'[month]\')[0].value='.date("m").'; document.getElementsByName(\''.$name.'[year]\')[0].value='.date("Y").';" />';
		if($mandatory)
			return $str."<b>&#42;</b>\n".self::addFormElementToMandatoryElementsList($name."[day]").self::addFormElementToMandatoryElementsList($name."[month]").self::addFormElementToMandatoryElementsList($name."[year]");
		else
			return $str;
	}

	/**
	 * Restituisce un oggetto form per caricare un file.
	 * @param string $name Nome del campo.
	 * @param string $filter Tipo di file selezionabile nel formato MIME: più
	 * opzioni devono essere separate da virgola.
	 * @param boolean $mandatory Se questo campo deve essere obbligatoriamente
	 * impostato.
	 * @param int $maxUploadSizeAllowed Se diverso da "NULL" e "0" include un
	 * altro campo invisibile in automatico che limita a lato client la
	 * dimensione massima di file consentita in unpload.
	 * @param string $other Altre propietà del componente HTML.
	 * @return string Stringa contenete l'html del campo da stampare a video.
	 */
	public static function getFileUploadFormElement($name, $filter = "", $mandatory = false, $maxUploadSizeAllowed = NULL, $other = "")
	{
		$filterStr = $filter == "" ? "" : "accept=\"".$filter."\"";
		$str = '<input type="file" name="'.$name.'" '.$filterStr.' '.$other.' />';
		if($mandatory)
			$str = $str."<b>&#42;</b>\n".self::addFormElementToMandatoryElementsList($name);
		if($maxUploadSizeAllowed > 0)
			$str = self::getUploadMaxSizeFormElement($maxUploadSizeAllowed)."\n".$str;
		return $str;
	}

	/**
	 * Restituisce un oggetto form che limita la grandezza massima che un file
	 * in upload può avere.
	 * @param int $maxSize Grandezza massima consentita in upload, espressa in
	 * byte.
	 * @return string Stringa contenete l'html del campo invisibile da stampare
	 * a video.
	 */
	public static function getUploadMaxSizeFormElement($maxSize)
	{
		return' <input type="hidden" name="MAX_FILE_SIZE" value="'.$maxSize.'" />';
	}

	/**
	 * Restituisce un elemento di un form HTML che rappresenta un selezionatore
	 * di elementi esterni provenienti da un elenco di altri valori.
	 * @param string $name Nome del campo.
	 * @param string $selectorPath Percorso del selettore.
	 * @param string $modelToSelect Model dell'oggetto da permettere la selezione.
	 * @param string $defaultVal Valore iniziale o NULL per non specificarlo.
	 * @param string $defaultValLabel Etichetta del valore iniziale o NULL per non
	 * specificarlo.
	 * @param boolean $mandatory Se questo campo deve essere obbligatoriamente
	 * impostato.
	 * @param array $optionalFieldsToPopulate Array associativo di ulteriori campi
	 * optionali da impostare, dove la chiave è l'elemento form da settare e il
	 * valore è il nome del campo da cui prelevare il valore nella tabella esterna.
	 * @param string $conditionParam Se si vuole imporre una condizione sull'
	 * elenco da mostrare sul valore di un parametro, questo argomento è il nome
	 * del parametro.
	 * @param string $conditionValue Se si vuole imporre una condizione sull'
	 * elenco da mostrare sul valore di un parametro, questo argomento è il
	 * valore del parametro.
	 * @param string $other Altre propietà del componente HTML.
	 * @return string Stringa contenete l'html del campo di selezione da
	 * stampare a video.
	 */
	public static function getExternalSelectorFormElement($name, $selectorPath, $modelToSelect, $defaultVal, $defaultValLabel, $mandatory = false, $optionalFieldsToPopulate = NULL, $conditionParam = "", $conditionValue = "", $other = "")
	{
		$str = '<input type="hidden" name="'.$name.'" value="'.$defaultVal.'" '.$other.' />';
		$str .= '<input type="text" name="'.$name.'_label" value="'.$defaultValLabel.'" disabled '.$other.' />';
		$optFld = $optionalFieldsToPopulate == NULL ? "null" : json_encode($optionalFieldsToPopulate);
		$str .= '<input type="button" value="Seleziona..." onClick=\'javascript:selectExternalElement("'.$selectorPath.'","'.self::$currentFormName.'","'.$name.'","'.$modelToSelect.'", '.$optFld.', "'.$conditionParam.'", "'.$conditionValue.'");\' />';
		if($mandatory)
			return $str."<b>&#42;</b>\n".self::addFormElementToMandatoryElementsList($name);
		else
			return $str;
	}

	private static $isTinyMceIncluded = false;

	/**
	 * Restituisce un elemento di un form HTML che rappresenta un grande campo
	 * di testo ricco, ovvero un campo di testo che può contenere testo
	 * formattato: questo componente già include barre degli strumenti per
	 * includere i tasti per la formattazione del testo.
	 * @param string $name Nome del campo.
	 * @param string $defaultVal Valore iniziale.
	 * @param int $width Largezza del campo di testo espresso in pixel:
	 * assegnare NULL per usare il valore di default e assegnare 0 per non
	 * specificare proprio questo attributo.
	 * @param int $height Altezza del campo di testo espresso in pixel:
	 * assegnare NULL per usare il valore di default e assegnare 0 per non
	 * specificare proprio questo attributo.
	 * @param boolean $mandatory Se questo campo deve essere obbligatoriamente
	 * impostato.
	 * @param string $other Altre propietà del componente HTML.
	 * @return string Stringa contenete l'html del campo di testo da stampare a
	 * video.
	 */
	public static function getRichTextAreaFormElement($name, $defaultVal = "", $width = NULL, $height = NULL, $mandatory = false, $other = "")
	{
		$str = "";
		if(!self::$isTinyMceIncluded)
		{
			$str = '<script type="text/javascript" src="'.TINY_MCE_INSTALL_DIR.'"></script>'.PHP_EOL;
			self::$isTinyMceIncluded = true;
		}
		if($width === NULL)
			$width = RICH_TEXT_AREA_DEFAULT_WIDTH;
		if($height === NULL)
			$height = RICH_TEXT_AREA_DEFAULT_HEIGHT;
		$sizewstr = "";
		if($width != 0)
			$sizewstr = 'width: '.$width.','.PHP_EOL;
		$sizehstr = "";
		if($height != 0)
			$sizehstr = 'height: '.$height.','.PHP_EOL;
		//rimosso: moxiemanager
		$str .= '<script type="text/javascript">
tinymce.init({
    selector: "textarea#'.$name.'",
    plugins: [
        "advlist autolink lists link image charmap print preview anchor",
        "searchreplace visualblocks code fullscreen",
        "insertdatetime media table contextmenu paste"
    ],
	'.$sizewstr.$sizehstr.'
    toolbar: "insertfile undo redo | styleselect formatselect fontselect fontsizeselect | bold italic | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | link image"
});
</script>';
		$str .= '<textarea id="'.$name.'" name="'.$name.'" '.$other.' >'.$defaultVal.'</textarea>';
		if($mandatory)
			return $str."<b>&#42;</b>\n".self::addFormElementToMandatoryElementsList($name);
		else
			return $str;
	}

	/**
	 * Restituisce una stringa inviata tramite un form in un campo di testo.
	 * @param string $elemName Nome dell'elemento nel form.
	 * @param array $requestArray Array che contiene i risultati della richiesta:
	 * ad esempio l'array _POST o _GET.
	 * @return mixed Il valore corrispondente nella risposta o NULL nel caso non
	 * sia stato trovato il campo richiesto nell'array passato.
	 */
	public static function getTextFromFormRequest($elemName, $requestArray = array())
	{
		if(!isset($requestArray[$elemName]))
			return NULL;
		return $requestArray[$elemName];
	}

	/**
	 * Restituisce una valore numerico inviato tramite un form.
	 * @param string $elemName Nome dell'elemento nel form.
	 * @param array $requestArray Array che contiene i risultati della richiesta:
	 * ad esempio l'array _POST o _GET.
	 * @param boolean $isFloat Booleana opzionale che specifica se restituire un
	 * float o un int(di default).
	 * @return mixed Il valore corrispondente nella risposta o NULL nel caso non
	 * sia stato trovato il campo richiesto nell'array passato.
	 */
	public static function getNumberFromFormRequest($elemName, $requestArray = array(), $isFloat = false)
	{
		if(!isset($requestArray[$elemName]) || !is_numeric($requestArray[$elemName]))
			return NULL;
		if($isFloat)
			return (float)$requestArray[$elemName];
		else
			return (int)$requestArray[$elemName];
	}

	/**
	 * Restituisce il valore corrispondente ad una scelta effettuata in una
	 * lista in un form.
	 * @param string $elemName Nome dell'elemento nel form.
	 * @param array $requestArray Array che contiene i risultati della richiesta:
	 * ad esempio l'array _POST o _GET.
	 * @return mixed Il valore corrispondente nella risposta o NULL nel caso non
	 * sia stato trovato il campo richiesto nell'array passato.
	 */
	public static function getChoosedValueFromFormListRequest($elemName, $requestArray = array())
	{
		if(!isset($requestArray[$elemName]))
			return NULL;
		return $requestArray[$elemName];
	}

	/**
	 * Restituisce vero o falso in base ad una scelta effettuata in una casella
	 * di spunta in un form.
	 * @param string $elemName Nome dell'elemento nel form.
	 * @param array $requestArray Array che contiene i risultati della richiesta:
	 * ad esempio l'array _POST o _GET.
	 * @return boolean Il valore corrispondente nella risposta.
	 */
	public static function getBooleanFromFormCheckBoxRequest($elemName, $requestArray = array())
	{
		if(!isset($requestArray[$elemName]) || $requestArray[$elemName] == NULL || $requestArray[$elemName] == "")
			return false;
		else
			return true;
	}

	/**
	 * Restituisce una data inviata tramite un form.
	 * @param string $elemName Nome dell'elemento nel form.
	 * @param array $requestArray Array che contiene i risultati della richiesta:
	 * ad esempio l'array _POST o _GET.
	 * @param boolean $isFloat Booleana opzionale che specifica se restituire un
	 * float o un int(di default).
	 * @return int Una data corrispondente nella risposta o NULL nel caso non
	 * sia stato trovato il campo richiesto nell'array passato o il formato
	 * ricevuto non è corretto.
	 */
	public static function getDateFromFormRequest($elemName, $requestArray = array())
	{
		if(!isset($requestArray[$elemName]) || !isset($requestArray[$elemName]["day"]) || !isset($requestArray[$elemName]["month"]) || !isset($requestArray[$elemName]["year"]))
			return NULL;
		$day = intval($requestArray[$elemName]["day"]);
		$month = intval($requestArray[$elemName]["month"]);
		$year = intval($requestArray[$elemName]["year"]);
		if(!checkdate($month, $day, $year))
			return NULL;
		return mktime(0, 0, 0, $month, $day, $year);
	}

	/**
	 * Questa costante indica la massima grandezza consentita di un file in
	 * upload che può essere gestita nel metodo
	 * "getFileContentFromFormFileUploadRequest", ovvero 2MB.
	 */
	const MAX_UPLOAD_ALLOWED = 2097152;

	/**
	 * Ritorna un file di cui è stato appena fatto l'upload.
	 * Questo metodo carica tutto il contenuto del file in una stringa quindi è
	 * da evitare da usare con file di grosse dimensioni(Max 2MB consentiti).
	 * 
	 * Nota: è opportuno usare "addslashes()" su UploadedFile::$fileContent se
	 * questo deve essere inserito in una query o stampato in qualche forma
	 * simile.
	 * @param string $elemName Nome dell'elemento nel form.
	 * @param bool $readFileContents Se deve caricare automaticamente il
	 * contenuto del file nell'attributo UploadedFile::$fileContent; nel caso
	 * questo parametro è "false" allora il suddetto attributo rimane NULL.
	 * @param array $allowedTypesOrExtensions Array di MIME Type o estensioni di
	 * file che sono consentite: nel caso nessuna di quelle passate nell'array
	 * combacia con il file, questo metodo restituisce "UPLOAD_ERR_EXTENSION".
	 * @return mixed Restituisce un intero rappresentativo dell'errore avvenuto,
	 * se l'upload fallisce, altrimenti restituisce un "UploadedFile" che
	 * descrive il file che è stato caricato.
	 */
	public static function getFileFromFormFileUploadRequest($elemName, $readFileContents = false, $allowedTypesOrExtensions = array())
	{
		$desc = $_FILES[$elemName];
		if($desc["error"] == UPLOAD_ERR_OK)
		{
			if($desc["size"] > self::MAX_UPLOAD_ALLOWED)
				return UPLOAD_ERR_FORM_SIZE;
			//check whether file is uploaded with HTTP POST
			if(!is_uploaded_file($desc['tmp_name']))
				return UPLOAD_ERR_NO_FILE;
			if($allowedTypesOrExtensions != null && is_array($allowedTypesOrExtensions) && count($allowedTypesOrExtensions) > 0)
			{
				$ext = Utils::get_extension($desc['name']);
				if(!in_array($ext, $allowedTypesOrExtensions) && ($desc['type'] != "" && !in_array($desc['type'], $allowedTypesOrExtensions)))
					return UPLOAD_ERR_EXTENSION;
			}
			$uploadFileDesc = new UploadedFile();
			if($readFileContents)
			{
				$uploadFileDesc->fileContent = file_get_contents($desc['tmp_name']);
				if($uploadFileDesc->fileContent === FALSE)
					return UPLOAD_ERR_NO_FILE;
			}
			$uploadFileDesc->fileName = $desc['name'];
			$uploadFileDesc->fileSize = $desc["size"];
			$uploadFileDesc->fileType = $desc['type'];
			return $uploadFileDesc;
		}
		else
			return $desc["error"];
	}

	/**
	 * Restituisce un messaggio in correlazione ad un codice di errore di
	 * upload di un file.
	 * @param int $error_code Codice errore di cui si desidera il messaggio.
	 * @return string Messaggio di errore relativo al codice passato.
	 */
	public static function getFileUploadErrorMessage($error_code)
	{
		switch ($error_code)
		{
			case UPLOAD_ERR_INI_SIZE:
				return 'Il file caricato è troppo grande! Eccede la grandezza massima consentita dal server.';
			case UPLOAD_ERR_FORM_SIZE:
				return 'Il file caricato è troppo grande! Eccede la grandezza massima consentita dal software.';
			case UPLOAD_ERR_PARTIAL:
				return 'Il file non è stato caricato completamente!';
			case UPLOAD_ERR_NO_FILE:
				return 'Il file non è stato caricato!';
			case UPLOAD_ERR_NO_TMP_DIR:
				return 'Il server non trova la cartella temporanea!';
			case UPLOAD_ERR_CANT_WRITE:
				return 'Il server non è riuscito a scrivere su disco!';
			case UPLOAD_ERR_EXTENSION:
				return 'Il file caricato non è del tipo consentito!';
			default:
				return 'C\'è stato un errore sconosciuto!';
		}
	}

	/**
	 * Permette di stampare il contenuto di un campo Blob di un DB come un file,
	 * che viene visualizzato, o eventualmente scaricato.
	 * @param string $contentValue Contenuto prelevato dal DB in formato stringa.
	 * @param string $mimeType MIME type del file da mostrare.
	 * @param bool $makeAsDownloadPage Forza il download del file.
	 * @param string $dowloadFileName Nel caso in cui sia un download come deve
	 * essere il suo nome file.
	 */
	public static function printBlobAs($contentValue, $mimeType, $makeAsDownloadPage = false, $dowloadFileName = "requestedFile.txt")
	{
		header("Content-type: ".$mimeType);
		if($makeAsDownloadPage)
		{
			header('Content-Disposition: attachment;filename='.$dowloadFileName);
			header('Cache-Control: max-age=0');
		}
		echo $contentValue;
	}

}

?>
